package org.layui.shop.controller;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.layui.shop.dao.UserDao;
import org.layui.shop.dao.impl.UserDaoImpl;
import org.layui.shop.entity.User;
import org.layui.shop.util.Md5Util;

import java.io.IOException;

/**
 * 实现登录逻辑
 * 第一：继承 HttpServlet
 * 第二：重写 doXxx 方法或 service 方法
 * 第三：在方法中实现业务功能
 * 第四：设置访问 URL
 *
 * @author ZQX
 * @date 2024-12-03
 */
@WebServlet("/login.do")
public class LoginServlet extends BaseController {
    @Override
    public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");

        // 1.获取表单中输入的数据
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String code = req.getParameter("code");

        // 2.验证数据的合法性 - 正则表达式（略）
        // 验证验证码是否正确
        HttpSession session = req.getSession();
        String rand = (String)session.getAttribute("rand");

        if(!(code!=null && rand.equalsIgnoreCase(code))) {
            print(res, error(500, "验证码输入错误"));
            return;
        }

        // 3.加工处理 - 业务实现
        // 3.1）实例化 DAO 对象
        UserDao userDao = new UserDaoImpl();

        // 3.2）调用 DAO 对象的方法，根据帐号查询用户
        User user = userDao.selectUserByName(username);


        // 4.响应结果 - 先数据封装到 ResponseData,然后序列为 JSON 字符串，最后响应数据
        if (user == null) {
            print(res, error(500, "没有此帐号，请注册"));
        } else if (Md5Util.equals(password, user.getPassword())) {
            // 密码设置为空，避免密码暴露给客户端浏览器
            user.setPassword(null);
            // 把登录用户存储在会话中
            session.setAttribute("user",user);
            print(res, success(200, user, "恭喜，登录成功！"));
            // 注意：在注册用户时，必须把明文的密码加密后再存储到数据表中
        } else {
            print(res, error(500, "登录失败，错误的帐号或密码"));
        }
    }
}
